﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Proxies;
using System.Windows.Forms;
using System.Runtime.Remoting.Messaging;

namespace Pixysoft.MultiThread
{
    public class WinformInvoker
    {
        public delegate void VoidInvoker();

        public delegate void ParamInvoker(params object[] paras);

        private delegate void DelegateWinformVoidInvoker(Control ctrl, VoidInvoker invoker);

        private delegate void DelegateWinformParamInvoker(Control ctrl, ParamInvoker invoker, params object[] paras);

        /// <summary>
        /// 导入代理实现invoke
        /// </summary>
        /// <param name="ctrl"></param>
        /// <param name="invoker"></param>
        public static void Invoke(Control ctrl, VoidInvoker invoker)
        {
            if (ctrl.InvokeRequired)
            {
                ctrl.Invoke(new DelegateWinformVoidInvoker(Invoke), new object[] { ctrl, invoker });
            }
            else
            {
                invoker();
            }
        }

        /// <summary>
        /// 导入代理实现invoke
        /// </summary>
        /// <param name="ctrl"></param>
        /// <param name="invoker"></param>
        public static void Invoke(Control ctrl, ParamInvoker invoker, params object[] paras)
        {
            if (ctrl.InvokeRequired)
            {
                ctrl.Invoke(new DelegateWinformParamInvoker(Invoke), new object[] { ctrl, invoker, paras });
            }
            else
            {
                invoker(paras);
            }
        }
    }

    public class WinformInvoker<T>
    {
        public delegate void GenericInvoker(T value);

        private delegate void DelegateWinformGenericInvoker(Control ctrl, GenericInvoker invoker, T value);

        /// <summary>
        /// 导入代理实现invoke
        /// </summary>
        /// <param name="ctrl"></param>
        /// <param name="invoker"></param>
        public static void Invoke(Control ctrl, GenericInvoker invoker, T value)
        {
            if (ctrl.InvokeRequired)
            {
                ctrl.Invoke(new DelegateWinformGenericInvoker(Invoke), new object[] { ctrl, invoker, value });
            }
            else
            {
                invoker(value);
            }
        }
    }
}
